package controlador;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.HashMap;
import java.util.Map;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import bean.TiempoBean;
import modeloDAO.NivelDAO;
import modeloDTO.Buscaminas;
import modeloDTO.Nivel;
import vista.VistaBuscaminas;

public class ControladorVistaBuscaminas extends MouseAdapter implements ActionListener {

	private static VistaBuscaminas vistaBuscaminas;
	private Buscaminas bm = new Buscaminas();
	private Nivel nivel = new Nivel();
	NivelDAO nivelDAO = new NivelDAO();
	ImageIcon imagenesMinas [] = new ImageIcon [12];
	ImageIcon bandera;
	ImageIcon Nobandera;
	static TiempoBean tiempo;
	private int casillas;

	public ControladorVistaBuscaminas() {
		super();
		ControladorVistaBuscaminas.vistaBuscaminas = new VistaBuscaminas();
		ControladorVistaBuscaminas.vistaBuscaminas.addListener(this);
		ControladorVistaBuscaminas.vistaBuscaminas.setVisible(true);
		tiempo= new TiempoBean(vistaBuscaminas);
		nivel = nivelDAO.consultarNivel("4");
		bm.setNivel(nivel);
		dibujarMatriz(bm);
		volverEmpezar(bm);
		vistaBuscaminas.setSize(nivel.getNumeroColumnas()*50, nivel.getNumeroFilas()*40);
		
	}

	public ControladorVistaBuscaminas(Buscaminas bm) {
		super();
		nivelDAO.ModificarNivel(bm.getNivel(),"4");
		dibujarMatriz(bm);
		volverEmpezar(bm);
		setBuscamina(bm);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand().equals("Nueva")){
			nivel = nivelDAO.consultarNivel("4");
			bm.setNivel(nivel);
			new ControladorVistaBuscaminas(bm);
			vistaBuscaminas.setSize(nivel.getNumeroColumnas() * 52, nivel.getNumeroFilas() * 42);
		}
		else if (e.getActionCommand().equals("Records")){
			new ControladorVistaPuntuaciones();
		}
		else if (e.getActionCommand().equals("Niveles")){
			new ControladorVistaNivel();																																									
		}
		else if(e.getActionCommand().equals("Salir"))
			System.exit(0);
		else
		{ 
			getBuscamina();
			int filas = bm.getNivel().getNumeroFilas();
			int columnas = bm.getNivel().getNumeroColumnas();

			for(int i=0;i<filas;i++)
				for(int j=0;j<columnas;j++)
				{
					if(e.getSource()==vistaBuscaminas.getBoton()[i][j] && vistaBuscaminas.getBoton()[i][j].getIcon()==null && vistaBuscaminas.getBoton()[i][j].getBackground()!=Color.WHITE)
					{
						vistaBuscaminas.getBoton()[i][j].setBackground(Color.white);
						if((String)bm.getMatriz().get(String.valueOf(i)+","+String.valueOf(j))=="1"){
							boom();
						}
						else
						{
							pulsarVacio(i,j); 
							casillas--;
							if(casillas==0)
								ganar();
						}                      
					}
				}
		}
	}

	public void mouseClicked(MouseEvent ev)
	{
		bandera = new ImageIcon("/home/estudiante/workspace/6-2-5-primer-proyecto/src/Icon Banderas/bandera3.jpg");
		int filas = bm.getNivel().getNumeroFilas();
		int columnas = bm.getNivel().getNumeroColumnas();
		for(int i=0;i<filas;i++)
			for(int j=0;j<columnas;j++)
			{
				if (ev.getSource()==vistaBuscaminas.getBoton()[i][j] && ev.isMetaDown()){ // botón derecho del ratón
					if(vistaBuscaminas.getBoton()[i][j].isOpaque()==false || vistaBuscaminas.getBoton()[i][j].getText()!=""){
						vistaBuscaminas.getBoton()[i][j].setIcon(null);
						vistaBuscaminas.getBoton()[i][j].setOpaque(true);
					}
					else if (vistaBuscaminas.getBoton()[i][j].getIcon()==null){
						vistaBuscaminas.getBoton()[i][j].setIcon(bandera);
						vistaBuscaminas.getBoton()[i][j].setOpaque(false);
					}
					break;
				}  
			}

	}     

	public void dibujarMatriz(Buscaminas bm){
		int filas = bm.getNivel().getNumeroFilas();
		int columnas = bm.getNivel().getNumeroColumnas();
		casillas = filas * columnas - bm.getNivel().getNumeroMinas();
		tiempo.stop();
		vistaBuscaminas.setTxtMinas(String.valueOf(bm.getNivel().getNumeroMinas()));
		vistaBuscaminas.getPanelMedio().removeAll();
		vistaBuscaminas.RedimensionarGrid(filas,columnas);
		for(int i=0;i<filas;i++)
			for(int j=0;j<columnas;j++)
			{
				vistaBuscaminas.getBoton()[i][j] = vistaBuscaminas.CrearBoton();
				vistaBuscaminas.getBoton()[i][j].setEnabled(true);
				vistaBuscaminas.getBoton()[i][j].setBackground(Color.darkGray);
				vistaBuscaminas.getPanelMedio().add(vistaBuscaminas.getBoton()[i][j]);
				vistaBuscaminas.getBoton()[i][j].addActionListener(this); //	Action Listener
				vistaBuscaminas.getBoton()[i][j].addMouseListener(this);
			}
		vistaBuscaminas.add(vistaBuscaminas.getPanelMedio(),"Center"); //Agregar el panel
		vistaBuscaminas.getPanelMedio().setPreferredSize(new java.awt.Dimension(1000, 1000));
	}

	void volverEmpezar(Buscaminas bm)
	{
		tiempo.stop();
		vistaBuscaminas.getTxtTiempo().setText("0");
		//	Volver al estado inicial
		for(int i=0;i<bm.getNivel().getNumeroFilas();i++)
			for(int j=0;j<bm.getNivel().getNumeroColumnas();j++)
			{
				bm.getMatriz().put(String.valueOf(i)+","+String.valueOf(j), "0");//MAPA[i][j]=0;
				vistaBuscaminas.getBoton()[i][j].setText("");
				vistaBuscaminas.getBoton()[i][j].setEnabled(true);
				vistaBuscaminas.getBoton()[i][j].setBackground(Color.darkGray);
				vistaBuscaminas.getBoton()[i][j].setIcon(null);
			}
		colocarMinas(bm);
	}

	void boom()
	{
		//Al perder la partida
		tiempo.stop(); //	parar el tiempo
		Nobandera = new ImageIcon("/home/estudiante/workspace/6-2-5-primer-proyecto/src/Icon Banderas/Nobandera3.jpg");
		//Cargando las imagenes de Minas
		for(int i=0;i<12;i++)
			imagenesMinas[i]=new ImageIcon("/home/estudiante/workspace/6-2-5-primer-proyecto/src/imagenesMinas/"+i+".jpg");

		int filas = bm.getNivel().getNumeroFilas();
		int columnas = bm.getNivel().getNumeroColumnas();

		for(int i=0;i<filas;i++)
			for(int j=0;j<columnas;j++)
			{
				if((String)bm.getMatriz().get(String.valueOf(i)+","+String.valueOf(j))=="1")
				{
					//	Imagen aleatoria de las minas
					double y1=Math.random()*12;
					int y=(int)y1;
					if(vistaBuscaminas.getBoton()[i][j].getIcon()==null)
						vistaBuscaminas.getBoton()[i][j].setIcon(imagenesMinas[y]);
				}
				else if(vistaBuscaminas.getBoton()[i][j].getIcon()!=null)
					vistaBuscaminas.getBoton()[i][j].setIcon(Nobandera);
				else vistaBuscaminas.getBoton()[i][j].setEnabled(false);
			}

		vistaBuscaminas.mostrarMensaje("Boom!!! Has perdido!!!");
	}
	
	void ganar()
	{
		//	Al ganar la partida
		tiempo.stop(); //	parar el tiempo
		vistaBuscaminas.mostrarMensaje("Has ganado. Tu tiempo es de: "+vistaBuscaminas.getTxtTiempo().getText() +" segundos");
		new ControladorVistaJugador(bm.getNivel(), vistaBuscaminas.getTxtTiempo().getText());
		volverEmpezar(bm);	
	}

	void colocarMinas(Buscaminas bm)
	{
		for(int i=0;i<bm.getNivel().getNumeroMinas();i++) //cargar con algunas minas
		{
			//Posiciones a manejar
			int x,y=0;
			double x1,y1=0;
			String valor;
			//Colocar mina aleatoria
			do
			{
				//Generar posiciones aleatorias
				x1=Math.random()*bm.getNivel().getNumeroFilas();
				y1=Math.random()*bm.getNivel().getNumeroColumnas();
				x=(int)x1;
				y=(int)y1;
				valor = (String)bm.getMatriz().get(String.valueOf(x)+","+String.valueOf(y));
			}while(valor!="0");
			bm.getMatriz().put(String.valueOf(x)+","+String.valueOf(y), "1"); //Poner mina
		}

		//Visualizar Tablero de minas en consola.
		for(int i=0;i<bm.getNivel().getNumeroFilas();i++) //Dibujamos por consola la matriz binaria
		{
			System.out.println(" ");
			for(int j=0;j<bm.getNivel().getNumeroColumnas();j++)
				System.out.print((String)bm.getMatriz().get(String.valueOf(i)+","+String.valueOf(j))+" ");
		}
		System.out.println(" ");
		System.out.println("-------------------------------------------");
	}

	public int minasCerca(int x,int y, Buscaminas bm)
	{
		/* x: numero de filas
    		   y: numero de columnas	
		 */
		int columnas = bm.getNivel().getNumeroColumnas();
		int filas = bm.getNivel().getNumeroFilas();
		int numeroMinas=0;

		//En horizontal
		for(int i=y-1;i<=y+1;i++){
			if(i>-1 && i<columnas){
				if((String)bm.getMatriz().get(String.valueOf(x)+ ","+String.valueOf(i))=="1"){
					numeroMinas++;
				}
			}
		}

		//	En vertical
		for(int j=x-1;j<=x+1;j++){
			if(j>-1 && j<filas)
				if((String)bm.getMatriz().get(String.valueOf(j)+ ","+String.valueOf(y))=="1"){
					numeroMinas++;
				}
		}

		//	En diagonal
		//	Posicion de la esquina superior izquierda
		int x1=x;
		int y1=y;
		x1--;
		y1--;
		for(int i=x1;i<x1+3;i++)
		{
			if(i>-1 && i<filas && y1>-1 && y1<columnas)
				if((String)bm.getMatriz().get(String.valueOf(i)+ ","+String.valueOf(y1))=="1"){
					numeroMinas++;
				}
			y1++;
		}

		//	Posicion de la esquina superior derecha
		x1=x;
		y1=y;
		x1--;
		y1++;
		for(int i=x1;i<x1+3;i++)
		{
			if(i>-1 && i<filas && y1>-1 && y1<columnas)
				if((String)bm.getMatriz().get(String.valueOf(i)+ ","+String.valueOf(y1))=="1"){
					numeroMinas++;
				}
			y1--;
		}
		return numeroMinas;
	}

	int cont=0; //Contador controlara las veces que presiona un botón con el tiempo paralizado.
	public void pulsarVacio(int i, int j)
	{
		//	Al precionar una casilla vacia.

		cont++;
		if(vistaBuscaminas.getTxtTiempo().getText().equals("0") &&  cont==1){ //Se activada solo la primera vez
			tiempo = new TiempoBean(vistaBuscaminas);
			tiempo.start();
		}
		vistaBuscaminas.getBoton()[i][j].setForeground(Color.black);
		vistaBuscaminas.getBoton()[i][j].setText(Integer.toString(minasCerca(i,j,bm))); //Cuantas Minas cerca
	}

	public Buscaminas getBuscamina() {
		return bm;
	}

	public void setBuscamina(Buscaminas bm) {
		this.bm = bm;
	}

}
